INT86X

                
               #include <dos.h>
               int int86x(intno,inregs,outregs,segregs);
               int intno;                    номер (число) прерываний
               union REGS *inregs;           значение  регистров  при вызове
               union REGS *outregs;          значение  регистров  при возврате
               struct SREGS *segregs;        значение  сегментов  при вызове
             

Описание.
Функция int86x выполняет прерывание 8086 программного обеспечения, которое определено номером прерывания intno . В отличие от функции int86 , функция int86x принимает значения регистра сегмента в segregs , позволяя программам, использующим сегменты данных большой модели или far -указатели, определять, какой сегмент или указатель должен быть использован в процессе системного вызова. Перед выполнением определенного прерывания int86x копирует содержимое inregs и segregs в соответствующие регистры. В segregs используются только значения регистров DS и ES. После возврата прерываний функция копирует значения текущего регистра в outregs и перезаписывает DS . Она также копирует состояние (статус) переносимого флага системы в поле cflag , содержащееся в outregs . Аргументы inregs и outregs являются объединениями типа REGS . Аргумент segregs является структурой типа SREGS . Эти типы объявлены в include -файле <dos.h> . Использование функции int86x предназначено для прямого вызова прерываний DOS , которые берут аргумент в регистре ES или значение регистра DS, которое отличается от умалчиваемого сегмента данных.

Возвращаемое значение.
Возвращаемым значением является значение в регистре AX после возвращения прерываний. Если поле flag в outregs является ненулевым, возникает ошибка и переменная _doserrno также устанавливает соответствующий код ошибки.

Замечание!
Значения сегмента для аргумента segreg могут быть получены либо при использовании функции segread , либо макро FP_SEG.

Пример:

                
               #include <signal.h>
               #include <dos.h>
               #include <stdio.h>
               #include <process.h>
                
               /* процедура int86x используется для генерирования прерыва-
         ния 0х21 (системный вызов), который, в свою очередь, активизирует
         системный  вызов  "Изменение  атрибутов"  DOS. Здесь используется
         процедура int86x, поскольку ссылка на имя файла может  находиться
         в сегменте, отличном от умалчиваемого сегмента данных (ссылка при
         помощи  far-указателя), поэтому регистр DS может быть точно уста-
         новлен со структурой SREGS. */
                
               #define SYSCALL 0x21
               /* INT 21H вызывает системные вызовы */
               #define CHANGE_ATTR 0x43
               /* системный вызов 43H - изменения атрибутов */
               char far *filename;
               /* имя файла в far-сегменте данных */
               union REGS inregs, outregs;
               struct SREGS segregs;
               int result;
               .
               .
               .
               inregs.h.ah=CHANGE_ATTR;
               /* AH - номер (число) системного вызова */
               inregs.h.al=0;
               /* AL - функция вызова атрибутов */
               inregs.x.dx=FP_OFF(filename);
               /* DS:DX указывают на имя файла */
               segregs.ds=FP_SEG(filename);
               result=int86x(SYSCALL,&inregs,&outregs,&segregs);
               if (outregs.x.cflag) {
                   printf("can't get attributes of file; error
                           number %d\n", result);
                   exit(1);
                   }
               else {
                   printf("Attribs=%#x\n", outregs.x.cx);
                   }
                
Hosted by uCoz